0313. 超级丑数【中等】
1. 📝 题目描述
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。
给你一个整数 n 和一个整数数组 primes,返回第 n 个 超级丑数。
题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。
示例 1:
txt
输入:n = 12, primes = [2,7,13,19]
输出:32
解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32]。1
2
3
2
3
示例 2:
txt
输入:n = 1, primes = [2,3,5]
输出:1
解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。1
2
3
2
3
提示:
1 <= n <= 10^51 <= primes.length <= 1002 <= primes[i] <= 1000- 题目数据 保证
primes[i]是一个质数 primes中的所有值都 互不相同,且按 递增顺序 排列
2. 🎯 s.1 - 多指针动态规划
c
int nthSuperUglyNumber(int n, int* primes, int primesSize) {
long* dp = (long*)malloc(sizeof(long) * n);
dp[0] = 1;
int* pointers = (int*)calloc(primesSize, sizeof(int));
for (int i = 1; i < n; i++) {
long mn = LONG_MAX;
for (int j = 0; j < primesSize; j++) {
long val = dp[pointers[j]] * primes[j];
if (val < mn) mn = val;
}
dp[i] = mn;
for (int j = 0; j < primesSize; j++) {
if (dp[pointers[j]] * primes[j] == mn) pointers[j]++;
}
}
int res = (int)dp[n - 1];
free(dp); free(pointers);
return res;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
js
/**
* @param {number} n
* @param {number[]} primes
* @return {number}
*/
var nthSuperUglyNumber = function (n, primes) {
const k = primes.length
const dp = new Array(n)
dp[0] = 1
const pointers = new Array(k).fill(0)
for (let i = 1; i < n; i++) {
let min = Infinity
for (let j = 0; j < k; j++) {
min = Math.min(min, dp[pointers[j]] * primes[j])
}
dp[i] = min
for (let j = 0; j < k; j++) {
if (dp[pointers[j]] * primes[j] === min) pointers[j]++
}
}
return dp[n - 1]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
py
class Solution:
def nthSuperUglyNumber(self, n: int, primes: List[int]) -> int:
k = len(primes)
dp = [0] * n
dp[0] = 1
pointers = [0] * k
for i in range(1, n):
candidates = [dp[pointers[j]] * primes[j] for j in range(k)]
dp[i] = min(candidates)
for j in range(k):
if candidates[j] == dp[i]:
pointers[j] += 1
return dp[-1]1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 时间复杂度:
,其中 是质数个数 - 空间复杂度:
算法思路:
- 与丑数 II 类似,为每个质数维护一个指针
- 每次取所有
的最小值,同时推进等于最小值的指针